#!/bin/bash

# 初始化参数
TEST_MODE=false
OUTPUT_DIR="$HOME/Downloads/Softwares"
# LOG_FILE="/tmp/software_install.log"
shellfilepath="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

#    / **  
#    *〈一句话功能简述〉  
#    *〈功能详细描述〉  
#    * @param [参数1] [参数1说明]  
#    * @param [参数2] [参数2说明]  
#    * @return [返回类型说明]  
#    * @exception/throws [违例类型] [违例说明]  
#    * @see [类、类#方法、类#成员]  
#    * @deprecated  
#    */  
function fun1()
{  
    msgstring="helld world !";
    echo "[Debug]: ${msgstring}";
    echo "[INFO]:  ${msgstring}";
    echo "[WARN]:  ${msgstring}";
    echo "[ERROR]: ${msgstring}";
	# 在shell中：
	# $0: 获取当前脚本的名称
	# $#: 传递给脚本的参数个数
	# $$: shell脚本的进程号
	# $1, $2, $3...：脚本程序的参数

    # $?: 获取上一命令或函数打印输出结果

    # 拆分字符串 
    # 原理：
    # ${parameter//pattern/string} 
    # 用string来替换parameter变量中所有匹配的pattern
    # 例子：以 , 拆分字符串
    #  string="hello,shell,split,test" 
    #  array=(${string//,/ }) 
    #  echo "[Debug] 循环输出 array[]所有值="${array[1]}
    # for var in ${array[@]}
    # do
    #    echo $var
    # done
    #  参考 [Shell_Linux Shell 中实现字符串切割的几种方法](https://blog.csdn.net/u010003835/article/details/80750003)

    # shell中各种括号的作用()、(())、[]、[[]]、{}
    # 参考资料 [hell中各种括号的作用](https://blog.csdn.net/taiyang1987912/article/details/39551385)
}

#    / ** 
#    * 日志函数
#    */  
function xecho() {
    local flag="$1"
    local message="$2"
    local timestamp=$(date +"%T")
    local color_code=""
    
    case "$flag" in
        INFO)    color_code="\033[0;37m" ;;
        Info)    color_code="\033[0;32m" ;;
        WARNING) color_code="\033[0;33m" ;;
        WARN)    color_code="\033[0;33m" ;;
        DEBUG)   color_code="\033[0;34m" ;;
        Debug)   color_code="\033[0;34m" ;;
        debug)   color_code="\033[0;34m" ;;
        ERROR)   color_code="\033[0;31m" ;;
        SUCCESS) color_code="\033[0;32m" ;;
        *)       color_code="\033[0m"    ;;
    esac
    
    if [[ "$TEST_MODE" == "true" ]]; then
        echo -e "${color_code}[$flag][$timestamp] $message\033[0m"
    elif [[ "$flag" == "ERROR" || "$flag" == "INFO" || "$flag" == "Info" || "$flag" == "WARNING" ||"$flag" == "SUCCESS"  ]]; then
        echo -e "${color_code}[$flag][$timestamp] $message\033[0m"
    fi
}

# 安全执行安装命令
function xeval(){
    local cmd="$1"
    xecho "INFO" "执行命令：$cmd"
    # eval "$cmd"
    if declare -f "${cmd%% *}" > /dev/null; then 
    # 这条命令检查 ${cmd%% *}（即命令字符串的第一个单词）是否是一个已定义的函数：
        $cmd
    else
        eval "$cmd"
    fi
}


#    / **  
#    *〈流程控制〉  
#    *〈该脚本的主函数〉  
#    * @param [无]  
#    * @return [无]  
#    * @exception/throws [无]  
#    * @deprecated  
#    */  
function processControlMain()  
{  
    # 打印当前系统时间  
    echo "Start..."  
    date  

    # 此处是你的代码  
    # ...  
    fun1

    msgstring="helld world !";
    xecho "Debug" "${msgstring}";
    xecho "INFO"  "${msgstring}";
    xecho "WARN"  "${msgstring}";
    xecho "ERROR" "${msgstring}";
    xecho "SUCCESS" "${msgstring}";

	# 执行另一个脚本
	# /bin/bash ./zsh2.sh
    # 打印当前系统时间  
    date  
    echo "The End."  
}  


# 执行入口 
# 进入脚本目录位置
cd `dirname $0`
# 获取当前脚本目录位置
# shellfilepath=`pwd`'/'$0
shellfilepath="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# 打印脚本目录地址
echo "[INFO]: 脚本地址 "${shellfilepath}

# 循环检查所有参数
for arg in "$@"; do
    if [[ "$arg" == "-t" || "$arg" == "-test" ]]; then
        TEST_MODE=true
        xecho "Debug" "找到 -t|-test 立即跳出循环"
        # xecho "Debug" "这是一个测试"
        break  # 找到后立即跳出循环
    fi
done

if true ;
# if false  
then  
    # echo "[Debug] true"
    # 开始执行  从标准输入中读取并同时写入到标准输出和指定的文件上 
    ## 拼接日志文件地址
    if $TEST_MOD; then 
    # if [[ "$TEST_MODE" == "true" ]]; then 
        #logfilepath=`pwd`'/'$0'.log'
        # logfilepath=`pwd`'/'$0'-'$(date +%Y%m%d)'.log'
        #logfilepath=`pwd`'/'$0'-'$(date +%y%m%d-%H-%M-%S)'.log'
        # logfilepath=$shellfilepath'/'$0'-'$(date +%Y%m%d)'.log'
        logfilepath=$shellfilepath'/'$(basename "$0" .sh)'-'$(date +%Y%m%d)'.log'
        ## 打印日志文件地址
        # echo "[INFO]: 日志地址" ${logfilepath}
        xecho "DEBUG" "日志地址 ${logfilepath}"
        processControlMain $1 $2 $3 $4 $5 | tee -a ${logfilepath}
        # # 加载软件列表配置文件
        # CONFIG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
        # # # 加载安装函数定义脚本文件
        # source "${CONFIG_DIR}/install_fun.sh"
    else  
        processControlMain $1 $2 $3 $4 $5
    fi
else  
    echo "[Debug] 函数单元测试 " ;
    ## 函数单元测试  
    #  
fi # 脚本结束

